SOURCE FILE: chatclient.c
/* chatclient.c */
#include <stdlib.h>
#include <stdio.h>
#include <cnaiapi.h>
#define BUFFSIZE 256
#define INPUT_PROMPT "Input > "
#define RECEIVED_PROMPT "Received> "
int recvln(connection, char *, int);
int readln(char *, int);
/*-----------------------------------------------------------------------
*
* Program: chatclient
* Purpose: contact a chatserver and allow users to chat
* Usage: chatclient <compname> <appnum>
* NOTE: CLIENT MUST SPECIFY HOST AND PORT.
*-----------------------------------------------------------------------
*/
int
main(int argc, char *argv[])
{
computer comp;
connection conn;
char buff[BUFFSIZE];
int len;
if (argc != 3) { /* ERROR OUT IF #ARGS WRONG */
(void) fprintf(stderr, "usage: %s <compname> <appnum>\n",
argv[0]);
exit(1);
}
/* convert the compname to binary form comp
-- i.e. CONVERT HOSTNAME TO NUMERIC VALUE. */
comp = cname_to_comp(argv[1]);
if (comp == -1)
exit(1);
/* make a connection to the chatserver
-- NOTE: comp IS THE CONVERTED HOSTNAME
AND argv[2] IS THE PORT NUMBER */
conn = make_contact(comp, (appnum) atoi(argv[2]));
if (conn < 0)
exit(1); /* IF ERROR, EXIT. */
/* PROMPT THE USER FOR A LINE */
(void) printf("Chat Connection Established.\n");
(void) printf(INPUT_PROMPT);
(void) fflush(stdout);
/* iterate, reading from local user and then from chatserver
-- THE EXPRESSION INSIDE THE while READS THE LINE
FROM THE USER. THE EXPRESSION HAS VALUE 'TRUE'
IF (and only if) A POSITIVE NUMBER OF CHARACTERS IS READ.
NOTICE THAT BECAUSE OF THE LOOP CONDITION AND THE BREAK STATEMENT
INSIDE THE LOOP BODY, THE LOOP IS RIGGED TO STOP IF EITHER
SIDE ENTERS EOF. */
while((len = readln(buff, BUFFSIZE)) > 0) {
buff[len - 1] = '\n'; /* ASSURE LAST CHAR IS eoln */
(void) send(conn, buff, len, 0); /* SEND LINE OVER CONNECTION */
/* receive and print a line from the chatserver
-- BREAK IF ZERO CHARACTERS ARE RECEIVED
(JUMP OUT OF THE LOOP) */
if ((len = recvln(conn, buff, BUFFSIZE)) < 1)
break;
/* WRITE THE LINE RECEIVED FROM THE SERVER
AND PROMPT FOR ANOTHER FROM THE CLIENT USER. */
(void) printf(RECEIVED_PROMPT);
(void) fflush(stdout);
(void) write(STDOUT_FILENO, buff, len);
(void) printf(INPUT_PROMPT);
(void) fflush(stdout);
}
/* iteration ends when stdin or the connection indicates EOF */
(void) printf("\nChat Connection Closed.\n");
(void) send_eof(conn);
exit(0);
}